Poderia ser uma prática ruim, não fosse o fato de que já é bastante óbvio o que você está falando no seu código, com base no contexto.
Dog = new Dog();
Qual é o construtor de tipos? Qual é o objeto? Não está confuso? OK, que tal
Dog = Dog.Create()?
Qual é o objeto? Qual é o método estático de fábrica no tipo? Ainda não está confuso? Eu acho que não.
A única vez que vi esse problema em potencial é quando a árvore do namespace se torna bastante elaborada e o compilador não consegue descobrir a ambiguidade. Nesse caso, você acaba com algo como
Dog = new Some.Namespace.Dog();
De qualquer forma, isso só deve acontecer com Propriedades automáticas (e talvez enumerações), pois os nomes de variáveis locais são sempre camelCased, evitando a ambiguidade completamente.
dog = new Dog();