I suspect that it might be simpler to write a method for each case, scalar and vector, as recipes are not functions we can broadcast.
For the last recipe, in the vector case one could write something like:
@recipe function f(::Type{Vector{B}}, b::Vector{B})
fillcolor --> permutedims([(a.x0==0 ? :red : :blue) for a in b])
bshape.(b)
end