Loading and Refreshing DataGrid in WinForms using C# .Net Framework
Single responsibility

Move the query logic to different class, let's call it DAL for example. In this implementation you are returning DataTable.  Returning a list of some class instead will make sure changes in the DB query/ schema will not affect the GUI but only the DAL class. 

LINQ

You can write the sql query using linq and then if you have syntax errors they will be cache during completion

Grid

I wonder why  you set the columns headers multiple times?

Think about this scenario: when the form loads, If the query return 0 results or there is a connection problem, how the grid will look like?