You could try something like:
var imageBuffer = new ImageBuffer (null, 100, 100, 32, PixelFormat.BGRA32);
var image = new Image (imageBuffer);
var surface = CairoImageSurface.fromImage (image);
var cairo = new Cairo (surface);
// perform cairo draw commands
var bitmapData = BitmapData.fromImage (image);
I think this would work. The basic concept is that you create a Lime ImageBuffer with the size you want. Using BGRA as the color order (rather than the traditional RGBA order) uses the same order that Cairo does – this requires no swizzling after a Cairo command. OpenFL uses this order on native right now for this benefit (and some other reasons).
When you create a buffer, it’s possible to wrap this with a CairoImageSurface, so Cairo commands use (or draw to) this exact data buffer. You can use Cairo or the Lime Image APIs (which is like BitmapData) to manipulate this data.
If you want to use this CairoImageSurface as a drawing source, you might set a cairo.target to it. If it is where you want to draw, then create a new Cairo instance to begin drawing.
If you want to use your Lime Image within OpenFL, BitmapData.fromImage should give you a BitmapData you can use 
