See this answer which already covers copying from one DataGridView to another.
I took the code and converted to vb.net using an online converter.
For this code to work, make a new project with two forms (Form1, Form2), each with a DataGridView on them (both named DataGridView1). Place a button on Form1 (Button1). Then paste the code in each form's respective code file.
Form1
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataGridView1.DataSource = {"A", "B", "C"}.Select(Function(s) New With {.Value = s}).ToList()
Form2.Show()
End Sub
Public Sub Foo()
Form2.Bar(DataGridView1)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Foo()
End Sub
End Class
Form2
Public Class Form2
Public Sub Bar(dgv_org As DataGridView)
Dim dgv_copy = DataGridView1
Try
If dgv_copy.Columns.Count = 0 Then
For Each dgvc As DataGridViewColumn In dgv_org.Columns
dgv_copy.Columns.Add(TryCast(dgvc.Clone(), DataGridViewColumn))
Next
End If
Dim row As DataGridViewRow = New DataGridViewRow()
For i As Integer = 0 To dgv_org.Rows.Count - 1
row = CType(dgv_org.Rows(i).Clone(), DataGridViewRow)
Dim intColIndex As Integer = 0
For Each cell As DataGridViewCell In dgv_org.Rows(i).Cells
row.Cells(intColIndex).Value = cell.Value
intColIndex += 1
Next
dgv_copy.Rows.Add(row)
Next
dgv_copy.AllowUserToAddRows = False
dgv_copy.Refresh()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
End Class