Good news everyone! Finally figured it out. What a pain.
So, without further ado, here is “How to set up label, depth, or other custom passes to work with transparency in Maya with Mental Ray”. Which doesn’t seem to exist anywhere on the internet 

So, first off, label & depth passes ain’t gonna work with any kind of interpolation, so you’re gonna have to turn it off everywhere. I’m just rendering everything out at 2x resolution and scaling it down later after post, works fine and really simple to set up. If you have the disk space.
The system I’ve got set up works great for materials with some 100% solid areas and some 0% solid areas, but isn’t going to work with anything that’s partially transparent, or has coloured transparency, and obviously doesn’t take other transparent effects like reflection and specular highlights into account. I’m just using lamberts here so it’s no problem for me, but YMMV innit. You may be able to fudge something to work around these issues, let us know if you do!
Right, so, here’s a basic outline.
[ol]
[li]Set your renderer to mental ray, make sure you set the frame buffer to 4x32bit, set antialiasing to “fixed” and “0” and disable “interpolate samples”. And filetype to OpenEXR if u want it work 
[/li][li]Add a customColor render pass
[/li][li]Look at whatever is going into the transparency input on your material (lambert3 in the pic). In my example case it was just a bulge texture. Right, so we’re going to need to force the alpha to be exactly 1 or 0 and nothing in between (ie, we’re creating a transparency threshold manually). We do that by inserting a condition node (transparencyThresholdCondition in the example above) between the two nodes, connect the input to “First Term”, set “Second term” to 0.5 (or whatever you want the threshold to be) and operation to “Less Or Equal”, and then connect the output back to the shader. Ok. That’s our transparency threshold.
[/li][li]Right, now we make a writeToColorBuffer node (customLabel_writeToColorBuffer2 in the example). Make sure it’s set up as in the example - “Evaluation Mode” to “Always” and “Write Operation” to “Add”, and don’t forget to hook it up to the correct pass (select the “custom Color Pass” in the drop down).
[/li][li]Now, the ridiculous step that was eluding me for ages, because AUTODESK DIDN’T MENTION IT IN THE MANUAL thanks guyz
That “Write Operation” you just set? Ain’t gonna do anything until you tick “Use Transparency” in the render pass node’s settings. Doh!
[/li][li]Make a singleSwitch or tripleSwitch node (sorry, forgot to show it in the example) and connect up all the objects, and set the inSingles to whatever you want the labels to be.
[/li][li]Ok, we’re getting there. So, normally we’d just connect the switch node’s output to the color attribute of the writeToColorBuffer node, but because we have to deal with transparency, and its set to add, that’s gonna add up where it shouldn’t. So, to counteract that, we’re gonna essentially “premultiply” the values, just as you would in 2D compositing if you wanted to do an ‘OVER’ compositing operation. So, make a multiplyDivide node (multiplyDivide2 in the example) and connect the shader’s outMatteOpacityR to input 1, and the switch nodes output to input 2. Yeah! However, because of this, we’re gonna need a separate writeToColorBuffer + multiply + condition setup for each shader that uses this…doh! Script it yeah?
[/li][li]Right, to actually make this work, you seem to need to connect the writeToColorBuffer directly to the shader network (I thought the connection via the multiply node would be enough, but it doesn’t seem to be, maybe somebody could explain that?). Anyway, just slap the outMatteOpacityR to the Alpha input on the writeToColorBuffer, and we’re all good.
[/li][/ol]
Hopefully that’s enough to give you a basic idea of the process I used. Obviously I skipped the basics, hope I didn’t miss anything important. You probably need a pretty good understanding of maya to get it running…I was definitely struggling a bit there! But the end result works - you can see it in Nuke at the bottom of the example, working great 
Seriously, why is that so frickin’ fiddly to do? I just wanted labels for compositing! It almost makes me wish I was a 2D animator. Almost 