I seem to have a habit of asking questions then sometime later answering them!
I noted @DS_London's suggestion but before I tried it, I actually looked at the link I referenced in my question (about injecting VBA).
(See question StackOverflow - https://stackoverflow.com/questions/67873692/how-can-i-ensure-that-an-addin-xll-is-packaged-with-c-sharp-programmatically/68022533#68022533)
With no C# approach being found/obvious I did this and it works. The functions in my XLLs are seen/usable in the C# programmatically produced workbooks. I have to manually enable security/macros when I open it and manually refresh the function (I am thinking of ways around this):
var codeText = "Private Sub Workbook_Open()\r\n";
codeText += " Dim ourAddin As Object" + "\r\n";
codeText += " Application.RegisterXLL (\"" + addin + "\")" + "\r\n";
codeText += " Set ourAddin = Application.AddIns.Add(\"" + addin + "\",True)" + "\r\n";
codeText += " ourAddin.Installed = True" + "\r\n";
codeText += "End Sub";
var workbookMainModule = workbook.VBProject.VBComponents.Item("ThisWorkbook");
workbookMainModule.CodeModule.AddFromString(codeText);