در مورد sort کردن داده پشت DataGridView در درجه اول داده هاتون رو از DB خوانده و در لیست قرار می دهید و در سپس لیست رو به BindingSource و در نهایت BindingSource رو به DGV بایند می کنید
برای Sort‌هم طبق پست قبلی عمل می کنید منتها اون لیست را Sort می کنید (بدیهی هست که نباید دیتا رو دوباره مرتب شده از DB گرفت) البته مرتب کردن لیست چند روش داره که یکیش به صورت زیر هست:

private bool _isSortAscending;
private DataGridViewColumn _sortColumn;
private void dgvCustomer_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
DataGridViewColumn column = dgvCustomer.Columns[e.ColumnIndex];
_isSortAscending = (_sortColumn == null || _isSortAscending == false);
string direction = _isSortAscending ? "ASC" : "DESC";
if(_isSortAscending)
CustomerBS.DataSource = Customers.OrderBy(c => c.GetType().GetProperty(column.DataPropertyName).G etValue(c, null));
else
CustomerBS.DataSource = Customers.OrderByDescending(c => c.GetType().GetProperty(column.DataPropertyName).G etValue(c, null));
if (_sortColumn != null) _sortColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
column.HeaderCell.SortGlyphDirection = _isSortAscending ? SortOrder.Ascending : SortOrder.Descending;
_sortColumn = column;
}


من سر نخ رو بهتون دادم باقیش دیگه با خودتون بود که دقیقا نیازتون رو براورده کنید!!!

در مورد داده های زیاد هم منطقی نیست که کل داده ها رو بخواهید در گرید نمایش بده کاربر نیازی به این همه دیتا نداره! نمی تونه استفاده درستی از داده ها به این شکل ببره. برحسب نیاز می تونید داده ها رو مثلا 100 تا 100 تا به Load کنید Linq این امکانو با استفاده از Skip و Take می ده و یا اینکه امکان جستجو در فرم رو به کاربر بدید که بر اساس یکسری فیلد ها که کاربر پر می کنه داده ها از DB‌خوانده بشه.

امیدوارم جوابتون رو گرفته باشید و اجازه بدید تاپیک روند خودشو طی کنه

موفق باشید