Ok, ahora pongo el código. Creo que todos mis problemas se deben a que doy unos valores de anchura y de visible antes de que los datos se "bindeen", por tanto, cuando se "bindean" al estar la columna a visible=false no se bindea esa columna, y la anchura del resto se amolda a los datos bindeados.
 
PD. Utilizo un AccesDataSource para meter los datos en la tabla.    
Código ASP:
Ver original<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
                    AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="usuario,hora" 
                    DataSourceID="AccessDataSource1" EnableSortingAndPagingCallbacks="True" 
                    Width="299px">
                    <PagerSettings FirstPageText="Principio" LastPageText="Final" 
                        NextPageText="Siguiente" PreviousPageText="Anterior" />
                    <RowStyle Wrap="True" />
                    <Columns>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:CheckBox ID="Selector" runat="server" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:BoundField DataField="usuario" HeaderText="usuario" ReadOnly="True" 
                            SortExpression="usuario">
                            <FooterStyle HorizontalAlign="Center" Width="20px" Wrap="False" />
                            <HeaderStyle HorizontalAlign="Center" Width="20px" Wrap="False" />
                            <ItemStyle HorizontalAlign="Center" Width="20px" Wrap="False" />
                        </asp:BoundField>
                        <asp:BoundField DataField="hora" HeaderText="hora" ReadOnly="True" 
                            SortExpression="hora">
                            <FooterStyle HorizontalAlign="Center" Width="20px" Wrap="False" />
                            <HeaderStyle HorizontalAlign="Center" Width="20px" Wrap="False" />
                            <ItemStyle HorizontalAlign="Center" Width="100px" Wrap="False" />
                        </asp:BoundField>
                        <asp:BoundField DataField="tipo" HeaderText="tipo" SortExpression="tipo">
                            <ControlStyle Width="20px" />
                            <FooterStyle Width="20px" Wrap="False" />
                            <HeaderStyle Width="20px" Wrap="False" />
                            <ItemStyle Width="100px" Wrap="False" />
                        </asp:BoundField>
                        <asp:BoundField ItemStyle-Width="1" DataField="dato" HeaderText="dato" 
                            SortExpression="dato" ReadOnly="true">
                            
                            
                            <ItemStyle Width="100px" HorizontalAlign="Left" Wrap="False" />
                            
                            
                        </asp:BoundField>
                    </Columns>
                    <PagerStyle HorizontalAlign="Center" />
                    <SelectedRowStyle BackColor="#CCFFFF" BorderStyle="Solid" Font-Bold="True" />
                    <EditRowStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="20px" 
                        Wrap="True" />
                    <AlternatingRowStyle BackColor="#CCFFCC" HorizontalAlign="Center" 
                        VerticalAlign="Middle" />
                </asp:GridView>
  
    
Código C#:
Ver originalprotected void BotonDibujar_Click(object sender, EventArgs e)
    {
 
        foreach (GridViewRow row in GridView1.Rows)
        {
            CheckBox cb = (CheckBox)row.FindControl("Selector");
            if (cb != null && cb.Checked)
            {
                
                s = s + row.Cells[4].Text + ";";
...