This may seem a bit crude but it should be fast and robust - finely discretize the region and look for the mesh vertices to be in cells:
r = Polygon@RandomReal[{0, 10}, {3, 2}] gridorigin = Floor[{Min[r[[1, All, 1]]], Min[r[[1, All, 2]]]}]; gridspace = {1, 1}; cc = Union[(({Round[#[[1]], gridspace[[1]]], Round[#[[2]], gridspace[[2]]]} + gridorigin + gridspace/2) &@ (# - gridorigin - gridspace/2) ) & /@ MeshCoordinates[DiscretizeRegion[r, MaxCellMeasure -> .01]]]; RegionPlot[r, PlotRange -> All, Prolog -> {{FaceForm[Blue], Rectangle[# - gridspace/2, # + gridspace/2] & /@ cc}, Line[{gridorigin + {#, 0}, gridorigin + {#, 10}}] & /@ Range[0, 8, gridspace[[1]]], Line[{gridorigin + {0, #}, gridorigin + {10, #}}] & /@ Range[0, 8, gridspace[[2]]]} , AspectRatio -> Automatic]

it should work with anything that DiscritizeRegion can handle:
r = ImplicitRegion[x^2 - y^2 <= 1 || x^2 + y^2 == 4, {x, y}]; gridorigin = {-5, -5}; gridspace = {.25, .5}; cc = Union[(({Round[#[[1]], gridspace[[1]]], Round[#[[2]], gridspace[[2]]]} + gridorigin + gridspace/2) &@ (# - gridorigin - gridspace/2) ) & /@ MeshCoordinates[ DiscretizeRegion[r, {{-4, 4}, {-4, 4}}, MaxCellMeasure -> .01]]]; RegionPlot[r, PlotRange -> {{-4, 4}, {-4, 4}}, Prolog -> {{FaceForm[Blue], Rectangle[# - gridspace/2, # + gridspace/2] & /@ cc}, Line[{gridorigin + {#, 0}, gridorigin + {#, 10}}] & /@ Range[0, 10, gridspace[[1]]], Line[{gridorigin + {0, #}, gridorigin + {10, #}}] & /@ Range[0, 10, gridspace[[2]]]} , AspectRatio -> Automatic]

note the region here includes an open circle, so the "holes" are correct. here are the mesh vertices:
