First off, what you're probably wanting is something like this:
Graphics[{Blue, Rectangle @@ basis}, Axes -> True, PlotRange -> {{0, 10}, {0, 10}}]
Let's examine what's going on. Consider this:
f[#1, #2] & /@ {a, b}
We have a function we're mapping over a list. Each element of the list gets fed to the function in turn. So, we get something like this right off the bat:
f[#1, #2] &[a]
creates an error message and results in this:
f[a, #2]
So, it had something it could put in the first slot, but not the second. Now, it doesn't matter if the elements are themselves lists, they still count as "one thing" in terms of arguments:
f[#1, #2] & /@ {{1, 2}, {3, 4}}
results in an error message and
{f[{1, 2}, #2], f[{3, 4}, #2]}
Again, you can see that it's able to fill the first slot but not the second. You can deduce from this that a form like
f[#1, #2] & /@ list
will always "fail" for any list with no level 1 elements.
Alternatives to consider are Apply and MapApply. Compare
f[#1, #2] & @@ basis
with
f[#1, #2] & @@@ basis