Here are some steps:
1. Each of your 20 database columns must be associated with a flag that have to be set or cleared if that column was selected or not. To implement this the best way is by using a
bits field,
so you will need a new column for storing the value of the bit fields. For more details about managing bits fields see the next article:
Masks and flags using bit fields in .NET[
^]
2. When the user will select and/or deselect a set of columns ==> the associated flags have to be updated (from false to true or viceversa) by using the logic from the 1st point above, then the new value of the "bits field" column must be stored in the database.
3. Your used UI control (Grid, ListView, table, etc) have to be generated dynamically in your view by using razor code and by checking the "bits field".
4. Because you are using a huge database, you must implement pagination to speed up the loading and the user iteration with your application.
PS: You could search for pagination articles on the web and you could have a look also on my articles about MVC, jqGrid and pagination.