Here is a sample (both VB and C#) that illustrates how to have a parent table which has a related child table, which also has a related grandchild table.
Below are some code snippets. The trick is to always make the main parent table be the DataSource for all the grid, and then set the DataMember to be the relation name where the relation starts at the parent table. This means the DisplayMember for the Child table is "ParentToChild", the name of that relation. And, the DisplayMember for the grandchild grid is "ParentToChild.ChildToGrandChild" whcih defines the relation starting at the parent grid through the child grid.
Dim dSet As New DataSet
'get the tables
Dim parentTable As DataTable = GetParentTable()
Dim childTable As DataTable = GetChildTable()
Dim grandChildTable As DataTable = GetGrandChildTable()
dSet.Tables.AddRange(New DataTable() {parentTable, childTable, grandChildTable})
'setup the relations
Dim parentColumn As DataColumn = parentTable.Columns("parentID")
Dim childColumn As DataColumn = childTable.Columns("ParentID")
dSet.Relations.Add("ParentToChild", parentColumn, childColumn)
parentColumn = childTable.Columns("childID")
childColumn = grandChildTable.Columns("ChildID")
dSet.Relations.Add("ChildToGrandChild", parentColumn, childColumn)
'set the grids
dataGrid1.DataSource = parentTable
dataGrid2.DataSource = parentTable
dataGrid2.DataMember = "ParentToChild"
dataGrid3.DataSource = parentTable
dataGrid3.DataMember = "ParentToChild.ChildToGrandChild"
dataGrid1.AllowNavigation = False
dataGrid2.AllowNavigation = False
dataGrid3.AllowNavigation = False
Contributed from George Shepherd's Windows Forms FAQ