I am not sure but I think the problem might be your composite primary key in the detail table.
I tried this code and it works fine.
I used the data you provided in the question.
DataTable dtMaster = new DataTable("bso_equipment_maint_bill_equ");
DataColumn dcMasterPK = dtMaster.Columns.Add("bill_equ_id", typeof(int));
dtMaster.PrimaryKey = new DataColumn[] { dcMasterPK };
dtMaster.Columns.Add("bill_id", typeof(int));
dtMaster.Columns.Add("equ_serial_nbr", typeof(string));
dtMaster.Columns.Add("equ_cost", typeof(decimal));
dtMaster.Columns.Add("maintenance_date", typeof(DateTime));
dtMaster.Rows.Add(1, 1, "1", 1000, DateTime.ParseExact("31/08/2014", "dd/MM/yyyy", null));
dtMaster.Rows.Add(8, 3, "a-400", 5000, DateTime.ParseExact("30/08/2014", "dd/MM/yyyy", null));
DataTable dtDetail = new DataTable("bso_equipment_maint_bill_part");
dtDetail.Columns.Add("bill_equ_id", typeof(int));
dtDetail.Columns.Add("part_nbr", typeof(string));
dtDetail.Columns.Add("part_cost", typeof(decimal));
dtDetail.Columns.Add("quantity", typeof(string));
dtDetail.Rows.Add(1, "a-209", 500, 1);
dtDetail.Rows.Add(1, "a-210", 800, 2);
dtDetail.Rows.Add(8, "a-211", 2500, 2);
DataSet ds = new DataSet();
ds.Tables.Add(dtMaster);
ds.Tables.Add(dtDetail);
DataRelation relation = new DataRelation("EquPartRel", ds.Tables["bso_equipment_maint_bill_equ"].Columns["bill_equ_id"], ds.Tables["bso_equipment_maint_bill_part"].Columns["bill_equ_id"]);
ds.Relations.Add(relation);
BindingSource bsMaster = new BindingSource(ds, "bso_equipment_maint_bill_equ");
BindingSource bsDetail = new BindingSource(bsMaster, "EquPartRel");
dgMaster.DataSource = bsMaster;
dgDetail.DataSource = bsDetail;
Maybe you should try to printout the contents of both tables before you create the relation.