The purchase links column is displaying "System.Web.UI.WebControls.HyperLink" or "System.Web.UI.WebControls.HyperLinkField" because these are the text values returned by the HyperLink or HyperLinkField controls' ToString method which is being called when the datagrid attempts to render that column during databinding when it encounters either webcontrol that you have stored in the datarow's "Purchase Links" column. There are several ways to correctly code this:
1. Instead of relying on the AutoGenerateColumns default behavior of the datagrid, you could set the grid's AutoGenerateColumns property to false and then create and add the appropriate type of column to the grid's Columns collection using a HyperLinkColumn control for the Purchase Links column. For this column, you would have to set the Text property to "Buy Now" - that is assuming that the same text appears in all rows of the column; the Target property to "_blank"; and the DataNavigateURLField to "Purchase Links". Then, instead of using a HyperLink control and attempting to store it in your datarow, simply set
dr["Purchase Link"] = ebayResponse.SearchResult[0].ItemArray[0].ViewItemURLForNaturalSearch;
when setting up the values in the datatable.
2. Since this is the only column you are having trouble with - note that it is the only one for which you were trying to store a control (not text) in the datatable - here's an even simpler approach: Continue to let the datagrid auto generate its columns as you are doing now. Don't use the Hyperlink control to build the link just build the html anchor string in code:
dr["Purchase Link"] = "< a href='" + ebayResponse.SearchResult[0].ItemArray[0].ViewItemURLForNaturalSearch + "' target='_blank'>Buy Now< /a >"
Note that I have had to insert an extra space after the first < and before the last > to post this string in the forum.