DataSet обычно используется для хранения результата из базы данных в памяти, т.е. он содержит объект DataTable. Сами объекты DataSet и DataTable не зависят от базы данных, поэтому результат не обязательно должен поступать из базы данных. DataSet может содержать несколько DataTables, и вы даже можете определить отношения между ними. Это как мини-база данных в памяти.
Источником привязки является любой объект, который может предоставить список объектов со свойствами. Это можно сделать с помощью DataSet или DataTable, но в основном это может быть список любого типа, содержащий объекты со свойствами.
TableAdapter используется для чтения данных из DataReader, предоставленного объектом Command, и помещения данных в объект DataTable.