O comentário de Joe Zack é o que me ajudou a entender o que está acontecendo aqui. Uma explicação muito clara e concisa. Esta deve ser uma resposta para que seja mais visível para as pessoas que chegam aqui a partir de uma pesquisa no google.
SqlCommand chama sql com parâmetros via sp_executesql quando há parâmetros, o que significa que sua tabela temporária é criada dentro (e depois limpa) um procedimento armazenado para que não esteja disponível para chamadas futuras - mesmo quando compartilham a mesma conexão