how well does the output resemble an optical RA-4 print (aka, removing the mask as a mask, not an overall colour cast - I take it that's what your grey card linearisation is aimed at?);
For the most part it looks like a picture taken with a digital camera that was shot raw and run through Adobe Camera Raw. The mask effectively is a color cast. There are two things at play here that trip most people up, the orange mask and the gamma of each channel. The gamma of each channel is rarely the same. They're usually relatively close, but not the same. If you apply the multipliers and then just invert it, you'll see that the blacks and shadows are actually correct and as you add more density, the colors start to diverge and color casts start to show up. If you adjust the gamma of each channel so that they're the same then apply the multipliers the color casts go away, assuming you shot the exposure cards at the same white balance as the film. From there, it's just a matter of making the gamma of each channel linear relative to the exposure that made it. If this is done correctly, in floating point linear light space, a correctly exposed (via incident reading) 18% grey card is 0.18, and each stop of exposure up or down doubles or halves that. My code does all this in one operation via a look up table that takes the raw integer samples as the index into the table and outputs the floating point values. The look up table is a basic text file so I can change the gamma of each channel and basically do whatever I want without actually changing any of the code. This is literally a handful of lines of code to suck in the lookup table and turn it into an in-memory array with the values and a handful of lines of code to step through each pixel and get the floating point value out of the array. The biggest challenge is figuring out the gamma of each channel so you can make the lookup table. That part you have to do for each emulsion you want to handle.
I'm not sure whether the colour checker is the correct choice for correctly representing the different fundamental colour balances of different films - the whole point of the colour checker profiling system is (as far as I understand it) to attempt to eliminate differences in colour reproduction between emulsions/ sensors - how well does it do this within your setup?
The color checker is so you can look at the red/green/blue/yellow/magenta/cyan patches and adjust the hue and saturation to your liking. Depending on what color space you picked as your source model, they'll either be a little off, or a lot off. If you want to do it via a 3D lut, you can, but it's just simpler to have a basic lookup table for the hues, and one for the saturation. Each film will have its variation of colors depending on the emulsion. You can use the hue and saturation look up tables to adjust it. Again, it's a handful of lines of code to suck in the file and turn it into an array, then another handful of lines of code to step through each pixel, calculate its current hue angle, use that as an index into the array to get how many degrees to adjust it, then adjust it, and do the same thing for saturation adjustment. The hue and saturation calculation algorithms are available via google as are the hue and saturation adjustment algorithms. If you google hard enough you don't even have to write that code as there are a multitude of examples of how to do it already written in C/C++ and pretty much any other language you would care to do this in. In my particular case, I have a set of C-41 generic tables that I use as a base and then modify from there as needed, though usually I just let it be as it's close enough for most emulsions. Again, I generally supply the ACR look in broad strokes, but in reality, you can make it look any way you want. I arrived at the generic lookup tables by actually starting to profile each emulsion to make an exact ACR look. After a few emulsions, it became pretty clear that there was a pattern of similar changes, so I took the ones that I had done and averaged them to make the generic. Each emulsion will vary a little from this generic, so each film does look different from each other using the same generic profile, but if you want to, you can totally dial that out or exaggerate it by making a set of tables specifically for that emulsion. In a way, that generic c-41 is basically similar RA-4 paper. Each emulsion for a given paper will vary how it looks a little because the paper and emulsion aren't exact mirrors to each other. My route is a little (a lot) different, but has the same effect. As a side note, what I'm doing here is actually exactly how LR and the DNG spec supplies it's various looks to raw files. The only difference is that I'm doing it in raw unmanaged space to conform things to a color space, and LR is doing it within the context of its internal color space to provide a look on top of it's flat ACR look.