Hi,
This was actually a nice challenge to try. It's possible, but you need to handle some of the cases previously handled by OutSystems by yourself. I think this could also be achieved using CSS grid layout, but then it would not be a table.
Here's how it looks:

I took the liberty of creating following data structure(s). This can be improved in many ways, but the principle remains - Data is a list of records containing a possible list of sub-records:
"Data" variable is used as Table Records widget's Source record list.
Next, I'm filling in the data. This can be achieved dynamically quite easily, query from your data source or append from modal / popup, depending on your use case. Whenever item is added or removed, table just needs to be refreshed using Ajax refresh widget. Again, for the sake of demonstration, I'm skipping adding rows and using screen preparation to do this:
- ListAppend_row<n> and ListAppend_Title<n> items are appended to Data list
- ListAppend<n> items are appening new SectionDataitems to the most recently appended ListAppend_row item like this:

Table / UI is the most tricky thing to achieve, but because OutSystems allows us to override HTML table properties using "colspan" and "rowspan" attributes in OutSystems element extended properties, table cells are completely customizable, albeit some of this is visible only during runtime.

To get rid of extra cells, we can hide table cells using "class" or "style" extended properties and use CSS "display: none" where we don't want a cell to be visible. If we are using "class" property, this causes all out-of-the-box classes to be overridden (TableRecords_OddLine / EvenLine), so these need to be added back manually using same class/style extended properties. This applies to your requirement for differently styled title rows as well, just add your own styling:
class
"TableRecords_"+If (Mod(TableRecords1.List.CurrentRowNumber+1,2)=0, "OddLine","EvenLine")
3rd column in the end of the table needs some extra trickery because it needs to span several rows. This is a simple example, where first item spans down and some use cases are probably not handled correctly. Rowspan can be set like this to drop the first row:
rowspan
If(TableRecords1.List.Current.IsCol3RowSpan, 99, 1)
Then I remove the subsequent columns from the screen with inline style:
style
If (TableRecords1.List.Current.IsTitleRow or TableRecords1.List[DecimalToInteger(Max(0,TableRecords1.List.CurrentRowNumber-1))].IsCol3RowSpan,"display:none;","")
Displaying a list of items inside table needs to be done with a web block, so I created one which takes a list of SectionDataitems as its input parameter. Nothing fancy here, just listing items with ListRecords widget:

I hope this helps, drop me a PM if you need to see the live version.
br,
-Mikko(N)