I was looking in to pre-existing variant types and found https://github.com/yglukhov/variant/blob/master/variant.nim
Something a bit clever I tried was using method to make it possible to pass $ down to a variant type's concrete subtype.
method box_to_string(self: Box): string =
"<boxed type: " & $self.code.int & ">"
method box_to_string[T](self: BoxConcrete[T]): string =
$self.value
proc `$`*(self: Box): string =
box_to_string(self)
This absolutely worked, but the compiler says generic methods are deprecated. Bummer.