Первое, что я хочу упомянуть, это то, что вам, вероятно, не нужен список. Скорее всего, IEnumerable достаточно. Даже если вам нужен список, легко преобразовать IEnumerable в список.
Имея это в виду, этот код является хорошим общим способом сделать это:
public static IEnumerable<T> ToEnumerable<T>(DataTable dt, Func<DataRow, T> translator)
{
foreach(DataRow dr in dt.Rows)
{
yield return translator(dr);
}
}
Надеюсь, вы увидите, насколько это многоразово. Все, что вам нужно сделать, это предоставить функцию, которая знает, как преобразовать отдельный DataRow в ваш тип T. Эта функция может использовать активатор, но это не обязательно. Он может просто использовать обычный конструктор и установить несколько свойств.