This operation is called the kronecker product when applied to matrices. There is a function for it:
http://reference.wolfram.com/language/ref/KroneckerProduct.html
KroneckerProduct[p1, p2]
Usually when you see this, you're actually doing a tensor product.
ArrayFlatten@TensorProduct[p1, p2]
{{0, 0, 0, -I}, {0, 0, I, 0}, {0, -I, 0, 0}, {I, 0, 0, 0}}
But, if I hadn't known any of this before, here is how I might have written it:
ArrayFlatten[placeholder*p2 /. placeholder -> p1]