It would've been easier, but that's not the idea here. When doing interop with big chunks of data to transfer, you'll need to handle them as a two-dimensional array. There's little point in intermediate conversion, either to jagged array or to generic list, when at the other end of the pipeline sits System.Data.DataTable.
Unless I've missed something, at the other end of the'pipeline' sits:
DataRowCollection.Add( object[] )
which can add the data for an entire row to the table in one call,
rather than requiring one call to
row[column-index] = valuefor each cell, along with the associated overhead (e.g., it fires events
for each use of the indexer's set method, which involves additional overhead
even if the events have no listeners).
So if given the choice, I would prefer to have the data in the form
of a list of arrays, with each array holding one row's data, and then
pass each of those to Add(), requiring only one call for each row.
Of course, it will ultimately depend on where the data is coming from, if it can
be gotten as a collection of arrays rather than a 2D array without far greater
cost, how many columns there are, and on whether merged cells are involved.