Not a good solution, but you can get he matrix using outer. Add row and column names separately.
outer(colnames(df), colnames(df), Vectorize(function(p, q) length(intersect(df[[p]], df[[q]]))))
Another possibility that I can think of right now is to find a distance matrix with length(intersect(.)) being the function to ind distances (it's not a metric, but I don't think any implementation checks that). The dist from stats does not allow custom functions, so you have to try other packages for this.
If someone posts a another solution, I'll remove mine. I don't like it myself.