Не уверен, что без перебора можно обойтись. Каким-то образом обойти значения все же придется. К тому же у DataTable нет возможности задать стразу все строки, только добавлять по одной. Могу предложить такой вариант:
var persons = new ObservableCollection<Person>();
var table = new DataTable("Persons");
var nameCol = new DataColumn("name") {DataType = typeof (string), AllowDBNull = true};
table.Columns.Add(nameCol);
var ageCol = new DataColumn("age") {DataType = typeof (int), AllowDBNull = false};
table.Columns.Add(ageCol);
persons.ToList().ForEach(p =>
{
var row = table.NewRow();
row.SetField(nameCol, p.Name);
row.SetField(ageCol, p.Age);
table.Rows.Add(row);
});