Here are two ways to get a column that doesn't really exist in the database. You can just pull a constant in your sql...like this:
SELECT '' as MyNewStringColumn, 0 as MyNewNumericColumn, CategoryId as SN, Name as CategoryName FROM Category
Then after you fill your DataTable, loop through it and fill the columns with what you want. But remember that you can fill that with anything accessible in SQL...so if your new column is the same thing as the SN you can just pull it twice in the SQL and give it a different alias:
SELECT CategoryId as SN, Name as CategoryName, CategoryId as SN2 FROM Category
Or if you can apply some kind of formula to it if you have one:
SELECT CategoryId as SN, Name as CategoryName, CategoryId + 1000 as SN2 FROM Category
Another method to add a column that doesn't exist in the database is this...First fill the DataTable with the sql you have. Then simply add another column to the DataTable. After that, loop through your table and for each row fill the new column with whatever you want, like this:
(It's in vb, but you should be able to get the idea)
dt.Columns.Add("MyNewColumn")
Dim intCount As Integer = 1
For Each row As DataRow In dt.Rows
row("MyNewColumn") = intCount
intCount += 1
Next
If the problem your really having is that you want the columns to have different headings...I don't think you can have DataTable columns with the same name, but you CAN set a different heading text to the columns in the DataGridView object. First you'd load your DataTable with two columns identical in all but name, then set it as the DataSource to your DataGridView, and then do this:
dgv.Columns("SN").HeaderText = "SN"
dgv.Columns("SN2").HeaderText = "SN"
Hope this helps.