never tried.
would set up a function that gives you the RGB values for the G/M shift, which is quite simple. ([R, G, B] = [128-x, 128+x, 128-x])
then transform it to XYZ and straight forward to bradford cone domain.
then just do the same scaling as with kelvin.
basically you could do this with any white point in any color space.
so:
Matrix gmShiftRef = new Matrix(3, 1);
gmShiftRef [0] = 0.5;
gmShiftRef [1] = 0.5;
gmShiftRef [2] = 0.5;
Matrix gmShiftRgb = new Matrix(3, 1);
gmShiftRgb[0] = 0.5-gmShift;
gmShiftRgb[1] = 0.5+gmShift;
gmShiftRgb[2] = 0.5-gmShift;
Matrix dst = RGBToXYZMatrix* gmShiftRgb;
Matrix src = RGBToXYZMatrix* gmShiftRef;
Matrix coneScale = new Matrix(3, 3);
coneScale [0, 0] = dst[0] / src[0];
coneScale [1, 1] = dst[1] / src[1];
coneScale [2, 2] = dst[2] / src[2];
Matrix xyzGMShift = XYZBradford.Inverse() * coneScale * XYZBradford;