To get multi-row headers in the standard LCL StringGrid you simply set FixedRows to the number of rows in the header. Merging columns (also: merging of rows) is addressed by one of the demos is mentioned.
But yes, of course, even if this works out this solution will not be compatible with TreeList, and you'll still have a lot to do to convert all these grids...
Did you consider porting the DevExpress component to Lazarus? I saw on their site that they do not support LCL, but you should have their sources. In a first try you could simply create a package for the TreeList and try to compile it. Keeping the Windows-related units, often this works with minor adjustments. Only in a next step you could try to make the package cross-platform by replacing the Windows units by LCL units (Windows --> LCLIntf and LCLType, Messages --> LMessages).