GridGraph belongs to the graph theory part of Mathematica and is neither an image nor a graphics. This causes many vicious problems.
Overlay can, in fact, overlay multiple graphics; but, the result is neither an image nor a graphics. This causes many vicious problems.
Show can overlay graphics properly. It is handy when combining plots, which graphics. The result is a graphic.
Graphics overlay earlier subexpressions with the later subexpressions. Therefore, the overlay operation can be done there also.
I leave as a reader's exercise to disasemble the following:
picture = Image[Graphics[
{{LightRed, Translate[Rotate[Rectangle @@ (ConstantArray[5.*Sqrt[1/2],
{2, 2}]*{-1, 1}), 45*Degree], {5, 5}]},
{Darker[Blue], (Line[{{0, #1}, {10, #1}}] & ) /@ Range[0, 10],
(Line[{{#1, 0}, {#1, 10}}] & ) /@ Range[0, 10], FaceForm[Gray],
EdgeForm[Darker[Blue]], Table[Disk[{x + 0.015, y - 0.015}, 0.08],
{x, 0, 10}, {y, 0, 10}]}, Text[Style["Text", Green, Bold, 72,
FontFamily -> "Times"], {5, 5}, {0, 0}]}, ImageSize -> {200, 200}]]
mask = Image[Graphics[{White, Translate[
Rotate[Rectangle @@ (ConstantArray[5.*Sqrt[1/2], {2, 2}]*{-1, 1}),
45*Degree], {5, 5}]}, ImageSize -> {200, 200}, Background -> Black]]
ImageApply[If[#2 == {0, 0, 0}, {1, 1, 1}, #1] & , {picture, mask}]

Of course, I may have missed something.