No, binding to a DataTable will not be faster than data-reader; in fact it will add overhead.
I would create a class that matches the table, and use either data-reader (manually) or "dapper" to fill it into a List<T>
. There won't be much speed difference between those two, as from lots of profiling: that is as fast as you'll get (short of moving the data closer to avoid LAN).
One option might be to cache the data locally, so most times you read you don't hit the DB at all. I would suggest maybe using protobuf-net to serialize to a file on the local disk; again - about the fastest you'll get. You could also store some token so you can tell when the data is stale - maybe the last timestamp or similar. Then you just check the DB to query the latest timestamp; if te same, read from your local copy. Otherwise load from the DB and then rewrite your local copy.