Thanks Leigh.
If anyone else is stuck with a similar problem, I finally got it working with the WKT2 string shown below.
I got the affine transformation parameters from a MapInfo PRJ definition of the custom projection (just the cosine and sine of the custom grid's rotation angle, scaling values and the x and y offsets), then added a DERIVINGCONVERSION section to UTM28N's WKT string and put the affine transformation parameters into the DERIVINGCONVERSION parameters A0,A1,A2,B0,B1,B2.
Mapinfo PRJ:
"CustomLocalGrid", 1008, 104,7, -15, 0, 0.9996, 500000, 0, 7, 0.641936585016, -0.766761053354, 592643.28732299805, 0.766757541511, 0.641937852139, -1507351.9635620117
DERIVEDPROJCRS["CustomLocalGrid",
BASEPROJCRS["WGS 84 / UTM zone 28N",
BASEGEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4326]],
CONVERSION["UTM zone 28N",
METHOD["Transverse Mercator",
ID["EPSG",9807]],
PARAMETER["Latitude of natural origin",0,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8801]],
PARAMETER["Longitude of natural origin",-15,
ANGLEUNIT["degree",0.0174532925199433],
ID["EPSG",8802]],
PARAMETER["Scale factor at natural origin",0.9996,
SCALEUNIT["unity",1],
ID["EPSG",8805]],
PARAMETER["False easting",500000,
LENGTHUNIT["metre",1],
ID["EPSG",8806]],
PARAMETER["False northing",0,
LENGTHUNIT["metre",1],
ID["EPSG",8807]]]],
DERIVINGCONVERSION["Affine",
METHOD["Affine parametric transformation",
ID["EPSG",9624]],
PARAMETER["A0",592643.2873,
LENGTHUNIT["metre",1],
ID["EPSG",8623]],
PARAMETER["A1",0.6419365850161,
SCALEUNIT["coefficient",1],
ID["EPSG",8624]],
PARAMETER["A2",-0.766761053354,
SCALEUNIT["coefficient",1],
ID["EPSG",8625]],
PARAMETER["B0",-1507351.96356201,
LENGTHUNIT["metre",1],
ID["EPSG",8639]],
PARAMETER["B1",0.766757541511,
SCALEUNIT["coefficient",1],
ID["EPSG",8640]],
PARAMETER["B2",0.641937852139,
SCALEUNIT["coefficient",1],
ID["EPSG",8641] ]],
CS[Cartesian,2],
AXIS["(E)",east,
ORDER[1],
LENGTHUNIT["metre",1]],
AXIS["(N)",north,
ORDER[2],
LENGTHUNIT["metre",1]],
USAGE[
SCOPE["unknown"],
AREA["World - N hemisphere - 18°W to 12°W - by country"],
BBOX[0,-18,84,-12]]
]