You could use a TemplateField and the GridView's RowDataBound event to achieve what you want. Here is a complete example:
ASPX:
<asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="ChkMyBitColumn" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Codebehind:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
'create some Testdata'
BindGrid()
End If
End Sub
Private Sub BindGrid()
Dim tbl As New DataTable
Dim rnd As New Random
tbl.Columns.Add(New DataColumn("MyBitColumn", GetType(Boolean)))
For i As Int32 = 1 To 10
Dim row As DataRow = tbl.NewRow
row("MyBitColumn") = rnd.Next(1, 3) Mod 2 = 0 'get a random boolean'
tbl.Rows.Add(row)
Next
Me.GridView1.DataSource = tbl
Me.GridView1.DataBind()
End Sub
Private Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim row = DirectCast(e.Row.DataItem, DataRowView).Row
Dim MyBitColumnValue = DirectCast(row("MyBitColumn"), Boolean)
Dim ChkMyBitColumn = DirectCast(e.Row.FindControl("ChkMyBitColumn"), CheckBox)
ChkMyBitColumn.Checked = MyBitColumnValue
ChkMyBitColumn.Enabled = Not ChkMyBitColumn.Checked
End If
End Sub