It's best to work from the underlying data rather than the DataGridView itself:
private void butDelete_Click(object sender, EventArgs e)
{
if (MyDataGridView.DataSource is DataTable dt)
{
List<int> deleteThese = new List<int>();
DateTime remove = new DateTime(2019, 2, 7);
int index = 0;
foreach (DataRow row in dt.Rows)
{
if (row["Appointment"] is DateTime apt && apt == remove)
{
deleteThese.Add(index);
}
index++;
}
foreach (int i in deleteThese)
{
dt.Rows[i].Delete();
}
}
}