You can try playing around with cards inside a!columnsLayout() above the grid, this will get you closest while still using the standard editable grid component:
a!localVariables(
local!data: {
{id: 1, text1: null, text2: null, text3: null, text4: null, text5: null, text6: null, text7: null, text8: null},
{id: 2, text1: null, text2: null, text3: null, text4: null, text5: null, text6: null, text7: null, text8: null},
{id: 3, text1: null, text2: null, text3: null, text4: null, text5: null, text6: null, text7: null, text8: null}
},
{
a!columnsLayout(
marginBelow: "NONE",
spacing: "NONE",
columns: {
a!forEach(
items: 1+enumerate(3),
expression:
a!columnLayout(
contents: {
a!cardLayout(
style: "INFO",
contents: {
a!richTextDisplayField(
labelPosition: "COLLAPSED",
align: "CENTER",
value: a!richTextItem(
text: concat("Header ",fv!item),
style: "STRONG"
)
)
}
)
}
)
)
}
),
a!gridLayout(
labelPosition: "COLLAPSED",
headerCells: a!forEach(
items: 1+enumerate(6),
expression: a!gridLayoutHeaderCell(label: concat("Column ",fv!item), align: "CENTER")
)
)
}
)