I tried make it on the basis of your demo, wp, but this code do nothing:
Yes, but this is different. While I was drawing on the canvas of the image (your "Terraincanvas") you are creating a new image and draw on that one. The problem here is how to create a transparent image by code. Took me some time until I found out, and only by contradicting my previous advice not to draw outside the OnPaint event... TImage is not a simple class, and it is hard to predict what is happening without digging into its implementation code.
A simpler way is to provide the buffer for the grid image manually, by using a TBitmap. The bitmap can be made transparent by filling with a predefined, unused color and setting this as the "transparent color"; after setting the bitmap's Transparent property to true only the pixels having a different color are drawn. This drawing now occurs again in the OnPaint event, but now on the canvas of the base image ("Terraincanvas").
Using this "color transparency", however, is a bit outdated today since it produces sharp transitions between transparent and opaque regions. This is ok for drawing horizontal and vertical lines, but for more general images it is preferrable to use "alpha-channel transparency" for which the bitmap must have 32-bits-per-color, and the additional 8 bits (compared to 24bpp) are used for transparency (or better: opaqueness) values. Unfortunately standard LCL graphics commands cannot use this because TColor reserves that 4th byte for system information. However, there are TLazIntfImage and TLazCanvas in the IntfGraphics unit which do support the alpha channel and can be used to draw on a transparent background. And there are simple commands to convert between TLazIntfImage and TBitmap so that a LazIntfImage can drawn easily on an LCL canvas.
The attached demos show all three techniques.