Just looking over your previous code, I see a lot of things that won't be necessary/good idea to use when using a GridView. Here is my advice before you start working on the front end - create a query that returns exactly what you want in your grid. Not that it's impossible to reformat things in a gridview, just from my experience, it's much easier to work with grids when the data you are binding to it is what you want in the grid.
Also, I have found using an ObjectDataSource as the data source of a gridview is hands-down the best implementation. If you don't know anything about ObjectDataSources, you should really read about them. Essentially, you create a function in a class in your project that returns a dataset (usually from a database select statement). You then indicate that function in your datasource. Finally, you identify that ObjectDataSource ID as the DataSourceID of the GridView. The reason I like this approach the best is you can then put the GridView and ObjectDataSource in an UpdatePanel and the whole thing will just "work" asynchronously (like paging and sorting).
Anyway, this should get you started.
<asp:GridView runat="server" ID="id1" AutoGenerateColumns="false" AllowSorting="true" AllowPaging="True">
<Columns>
<asp:ImageField DataImageUrlField="RowImageURL" />
<asp:HyperLinkField DataNavigateUrlFields="SubjectURL" DataTextField="Subject" HeaderText="Subject" SortExpression="Subject" />
<asp:BoundField HeaderText="From/To" DataField="FromUser" SortExpression="FromUser" />
<asp:BoundField HeaderText="Date" DataField="Created" SortExpression="Created" />
<asp:CheckBoxField />
</Columns>
</asp:GridView>