This is a really interesting question.
I think the way you could do this, using strictly box2d, would be store all the points in some kind of array, and then pop them into the polygon function.
I've never used a poly myself, but judging from this:
https://stackoverflow.com/questions/4360084/creating-complex-shapes-with-box2d
You may be able to use the function createShape()
What I do remember, is there is definitely a way to read vectors into a fixture, the most logical way for that to work would be in some kind of stack.
If you've already grabbed the points based on user input, you simply need to feed them into the box2d poly function, create a fixture/body or whatnot and then add it to your world.
As far as the image, I'm pretty sure you can do this using opengl, but I'm not sure what exactly you mean. If you just want them to be able to draw an amoeba shape and then fill it with a solid color, that should be easy.
If however you want to take an existing image and skew it to fit into the fixture shape, that will be hard. I'm sure you can do it though, here's an example of what blitting looks like using opengl (note, this is in Java)
glPushMatrix();
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
dirPosd = i.shield.getPosition().mul(30);
glTranslatef(dirPosd.x, dirPosd.y, 0);
glRotated(Math.toDegrees(i.shield.getAngle()+52.9), 0, 0, 1);
glColor3f(1,1,1);
animationY.bind();
sizer = 40;
glBegin(GL_QUADS);
glTexCoord2f(0f, 0f);
glVertex2f( i.shield.getPosition().x - sizer-4, i.shield.getPosition().y - sizer-2); //NW
glTexCoord2f(1, 0);
glVertex2f( i.shield.getPosition().x + sizer-4, i.shield.getPosition().y - sizer-2); //NE
glTexCoord2f(1, 1);
glVertex2f( i.shield.getPosition().x + sizer-4, i.shield.getPosition().y + sizer-2); //SE
glTexCoord2f(0, 1);
glVertex2f( i.shield.getPosition().x - sizer-4, i.shield.getPosition().y + sizer-2); //SW
glEnd();
glPopMatrix();
Your solution will be somewhere between the glBegin() and glEnd(), and will involve manipulating the glTexCoord2f() and glVertex2f(). I've played around with these a bit and achieved bizarre skews, and I'm sure you can use that to achieve what you trying to do.
The fact is, I have no clue how to actually do it, you'll probably have to take an in depth look into opengl, focusing on some of those functions I mentioned.
EDIT>>>
Note: Yes, that code I posted is obviously a mess, but the purpose is to provide a rough example (but it does work). For the functionality you require, you will need a competent understanding of the opengl library.