Я всегда использую removeat, сначала проверяя, что что-то выбрано, а затем выполняю removeat при передаче индекса.
if(dataGridView1.CurrentRow.Index > -1 && !dataGridView1.Rows[dataGridView1.CurrentRow.Index].IsNewRow)
dataGridView1.Rows.RemoveAt(dataGridView1.CurrentRow.Index);
РЕДАКТИРОВАТЬ: Добавлена проверка для IsNewRow в случае, если AllowUsersToAddRows имеет значение True, которое выдает и исключение, если это была выбранная строка.