El comentario de Joe Zack es lo que me ayudó a entender lo que está pasando aquí. Una explicación muy clara y concisa. Esta debería ser una respuesta para que sea más visible para las personas que llegan aquí desde una búsqueda en Google.
SqlCommand llama a sql con parámetros a través de sp_executesql cuando hay parámetros, lo que significa que su tabla temporal se crea dentro (y luego se limpia) en un procedimiento almacenado, por lo que no está disponible para llamadas futuras, incluso cuando comparten la misma conexión