Step 1
As a very quick example of how one might start, with the limitation of only one "type" available:
convert[Grid[m_?MatrixQ, ___]] := m[[All, All, 1]]
Defer[convert]@Grid[ConstantArray[RadioButton[], {4, 7}], Spacings -> {0.2, 0}]
Which outputs:

You then make a selection:

And evaluate it (the output), yielding:
{{False, False, False, True, False, False, False},
{False, False, False, False, True, True, True},
{False, False, True, False, False, False, False},
{False, False, False, False, False, False, False}}
This could easily be converted to your {x,y,type} format with something like:
MapIndexed[Append[#2, #] &, %, {2}]
Step 2
Still not addressing the need for multiple types but now with non-rectangular packing, easily generalized to arbitrary placement:
hex = Join @@ Array[{#2 + #, (#2 - #)/Sqrt[3]} &, {5, 5}, -2];
convert2[g_Graphics] :=
Cases[g, Inset[RadioButton[value_, True], pos_] :> {value, pos}, -3]
Graphics[{
Inset[RadioButton[], #] & /@ hex
}, ImageSize -> 150] // Defer[convert2]

And when evaluated:
{{False, {-4, 0}}, {True, {-3, 1/Sqrt[3]}}, . . .,
{False, {3, -(1/Sqrt[3])}}, {False, {4, 0}}}