There are some issues with ordinal mappings.
Looks like source and destination are backwards in BulkCopyToServer.
Not to mention that neither is really correct there, since:
1) The source DataTable is passed in (this is the basis for the source ordinal)
2) The target table is specified (this is the basis for the target ordinal)
3) The target DataTable is calculated from the mappings (only the mapped columns are included). The basis for this table is neither of the above two, and needs to be reconciled lest you get your mappings all crossed up.
And GenerateColumnMetaData is calculating the target DataTable incorrectly. It should be in the target table's order, but only including the mapped columns (i.e., sorted by destination ordinal).