I found a solution which doesn't rely on looping through the columns.
It uses the 'Merge' method, which I had previously dismissed as I thought both tables required the same structure.
First you need to create a primary key on the two data-tables:
// set primary key
T1.PrimaryKey = new DataColumn[] { T1.Columns["DateStamp"] };
T2.PrimaryKey = new DataColumn[] { T2.Columns["DateStamp"] };
Then add both tables to a data-set so a relationship can be added:
// add both data-tables to data-set
DataSet dsContainer = new DataSet();
dsContainer.Tables.Add(T1);
dsContainer.Tables.Add(T2);
Next add the relationship between the two key columns in the data-set:
// add a relationship between the two timestamp columns
DataRelation relDateStamp = new DataRelation("Date", new DataColumn[] { T1.Columns["DateStamp"] }, new DataColumn[] { T2.Columns["DateStamp"] });
dsContainer.Relations.Add(relDateStamp);
Finally you can now copy the first data-table into a new 'combined' version, and then merge in the second:
// populate combined data
DataTable dtCombined = new DataTable();
dtCombined = T1.Copy();
dtCombined.Merge(T2, false, MissingSchemaAction.Add);
Note: The Merge method requires the second argument to be false or else it copies the structure but not the data of the second table.
This would then combine the following tables:
T1 (2012-05-09, 111, 222)
T2 (2012-05-09, 333, 444, 555)
into a combined version based on the primary-key:
J1 (2012-05-09, 111, 222, 333, 444, 555)