I also bit bang (bash?) my I2C on the PIC32. Microchip has an example driver, but it uses a timer and a state machine, like you, not what I wanted. So I just bang and wait, etc. I was able to tune the code by hand for 1000 kHz operation and then I have a Init routine so I can adjust the clock up and down to 100, 400 and 1000 kHz operation at run-time.
If you don't know where to start - then IMHO, Melexis has roughed out a wonderfully simple and concise driver for use with one of its sensors, really if I had to do it again, I would use this as a guide,
I didn't know about that when I started, so I used the Philips (now NXP) application notes to develop my driver + I looked at some GNU Arduino drivers to see how others have done it (API ideas, etc). I think the Melexis code is better however.
Here is a step by step guide from Microchip that describes the interface in some detail (I liked the NXP info better, but to each his own, this is a different way of describing the I2C operation.
Hope this helps