I think you're going to have to do your data manipulation when fetching the records (inside GetPublishers() function) - this way you will still be able to use ObjectDataSource as your DataSource for the grid.
Alternatively you can try and populate the grid from your custom object (publishers) rather than using ObjectDataSource. You will then have to implement function/s for the gridview paging (gridview_PageIndexChanging(object sender, GridViewPageEventArgs e) should do the job)
The simplest example of PageIndexChanging implementation (it's more of a trick than proper implementation really) is
protected void GridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gv.PageIndex = e.NewPageIndex;
gv.DataBind();
}
Although since you're dealing with large data and mentioned performance I'd recommend doing right and fetch only the rows you'll be displaying. The below can help
https://web.archive.org/web/20211020140032/https://www.4guysfromrolla.com/articles/031506-1.aspx