I'd try something like this:
For i = DataGridView1.Rows.Count -1 To 0 Step -1
Dim srcRow As DataGridViewRow = DataGridView1.Rows(i)
Dim rowsToRemove = DataGridView2.Rows. _
Cast(Of DataGridViewRow)(). _
Where(Function(row) row.Cells("id").Value = srcRow.Cells("id").Value AndAlso row.Cells("name").Value = srcRow.Cells("name").Value). _
ToList()
Dim x As Integer = rowsToRemove.Count
For Each dstRow In rowsToRemove
DataGridView2.Rows.Remove(dstRow)
Next
If x>0 Then DataGridView1.Rows.Remove(srcRow)
Next
Note: above code has been written direct from my head... ;)