You said you are new to Lazarus, so maybe that what follows will be too much for you. Here are the basics:
Define a new class which inherits from TStringGrid (or TCustomStringGrid - but that's another detail...). In the protected part of the class declaration declare the procedure CalcCellExtent and add the attribute "override" to indicate the compiler to use this new method instead of the inherited one. In the new CalcCellExtent method you must tell the grid which cells belong to the merged block, i.e. you return the left, top, right and bottom coordinates of the block. The most flexible way to do this is by introducing an event - let's call it OnMergeCells: this event will get the col/row parameters of a cell - this cell is checked if it belongs to a merged block. If it does the event will return the outer coordinates of the entire block. The CalcCellExtent method will call this event and calculate the rectangle parameters to be passed to the calling function.
The next major task is to paint the cell text into to larger merged block. All the painting jobs in the grid are performed by little virtual methods, therefore you can almost completely control the entire painting process. The most suitable method for our task is the DrawCellText method. When this is called all the background and the grid lines already have been painted. You must override this and increase the drawing rectangle to that of the merged block, and you also must determine where the cell text comes from. I propose to write the cell text into the upper left cell of the merged block. Therefore, DrawCellText must look for this cell and pick the text from it.
I wrote a little demo of these basic steps. Just run the attached project. There are still lots of features missing: you can select every individual cell of the block, text input into the merged block is strange (enter it into the top left cell of the block, and then enforce a repaint of the entire grid, e.g. by dragging the window out of the monitor and back in again).
To fix all that you must find the corresponding method of TCustomGrid or TCustomDrawGrid and modify it in the code of TStringGridEx to your needs. Have a look at the list that I had mentioned in the previous post.
When everything is perfect you can create a package and install your new component into Lazarus. The demo uses only a runtime-created version. In the end you will have made a good learning experience of the inner workings of the LCL.