Here, I gave one example of in-memory DataTables master - detail relationship.

Now I will extend that example with DataGridView.

First lets create master DataTable:

private DataTable CreateMasterDataTable()
{
	DataTable dtMaster = new DataTable("Master");
	dtMaster.Columns.Add("Id", typeof(int));
	dtMaster.Columns.Add("SomeText", typeof(string));
	dtMaster.PrimaryKey =
	[
		dtMaster.Columns["Id"]
	];

	return dtMaster;
}
Now detail DataTable:
private DataTable CreateDetailDataTable()
{
	DataTable dtDetail = new DataTable("Detail");
	dtDetail.Columns.Add("Id", typeof(int));
	dtDetail.Columns.Add("MasterId", typeof(int));
	dtDetail.Columns.Add("SomeText", typeof(string));
	dtDetail.PrimaryKey =
	[
		dtDetail.Columns["Id"]
		, dtDetail.Columns["MasterId"]
	];

	return dtDetail;
}
DataSet:
DataSet dsMasterDetail = new DataSet("MasterDetail");
dsMasterDetail.Tables.Add(CreateMasterDataTable());
dsMasterDetail.Tables.Add(CreateDetailDataTable());
Relation and add relation to DataSet:
DataRelation relMasterDetail = new DataRelation("MasterDetailRelation"
	, dsMasterDetail.Tables["Master"].Columns["Id"]
	, dsMasterDetail.Tables["Detail"].Columns["MasterId"]
);

dsMasterDetail.Relations.Add(relMasterDetail);
Now, lets create BindingSource and attach it to DataSource of DataGridView:
var dsMasterDetail = CreateMasterDetailDataSet();
BindingSource bsMaster = new BindingSource
{
	DataSource = dsMasterDetail,
	DataMember = "Master"
};
dgvMaster.DataSource = bsMaster;

BindingSource bsDetail = new BindingSource
{
	DataSource = bsMaster,
	DataMember = "MasterDetailRelation"
};
dgvDetail.DataSource = bsDetail;
Here notice that DataSource of detail BindingSource I have attached master BindingSource, as DataMember name of relation:
BindingSource bsDetail = new BindingSource
{
	DataSource = bsMaster,
	DataMember = "MasterDetailRelation"
};
Example download from here.