Podría ser una mala práctica, si no fuera por el hecho de que ya es bastante obvio de qué estás hablando en tu código, según el contexto.
Dog = new Dog();
¿Cuál es el constructor de tipos? Cual es el objeto? No confundido? OK, que tal
Dog = Dog.Create()?
Cual es el objeto? ¿Cuál es el método de fábrica estático en el tipo? ¿Todavía no estás confundido? No lo creo.
La única vez que he visto que esto es un problema potencial es cuando el árbol del espacio de nombres se vuelve bastante elaborado, y el compilador no puede descubrir la ambigüedad, en cuyo caso terminas con algo como
Dog = new Some.Namespace.Dog();
En cualquier caso, esto solo debería suceder con las Propiedades automáticas (y tal vez enumeraciones), ya que los nombres de las variables locales siempre son camelCased, evitando por completo la ambigüedad.
dog = new Dog();