You can also specify the title style and width of the ItemStyle. You can also add a range and set the width. Thus, the width of the element will remain the value, whether it is empty or contains any value. I think that small changes to gridview will allow you to achieve a solution to your problem.
<asp:TemplateField HeaderText="Category" HeaderStyle-HorizontalAlign="Center"
ItemStyle-HorizontalAlign="Center">
<HeaderTemplate>
<asp:LinkButton ID="lnkCategory" runat="server" ToolTip="Click here to sort by Category"
CommandName="Sort" CommandArgument="Category" Text="Category" />
</HeaderTemplate>
<ItemTemplate>
<span style="width:50px"> <%#Eval("Category")%> </span>
</ItemTemplate>
<HeaderStyle HorizontalAlign="Left" Width="50px" ></HeaderStyle>
<ItemStyle HorizontalAlign="Left" Width="50px"></ItemStyle>
</asp:TemplateField>
Impossible changes
<ItemTemplate>
<span style="width:50px"> <%#Eval("Category")%> </span>
</ItemTemplate>
<HeaderStyle HorizontalAlign="Left" Width="50px" ></HeaderStyle>
<ItemStyle HorizontalAlign="Left" Width="50px"></ItemStyle>