The following event can possibly get called hundreds of times a frame.
public bool OnCollision(Body body1, Body body2) { if(body2.Tag is Dog) ((Dog)bo
if(body2.Tag is Dog)
is actually compiled as
Dog Temp = body2.Tag as Dog; if (temp != null)
In your code, you're then doing the cast again. Better would be:
Dog dog = body2.Tag as Dog; if (dog != null) { dog.Bark(); }