This is a very interesting question: vote => 5. It's also a question I think would be very appropriate to put in the CodeProject 'Algorithms Forum, if you care to move it.
Once you go beyond the simple goal of a no-overlap shuffle:
group of 8 people. I want to write a method that makes one person point to a different one in the same group
and start adding in rules for specific valid/invalid "pointing" cases, then I view this as the kind of problem that "decision tables" (references below) are designed to model. Similar problems arise in creating language parsers, or state-machines for interface design. imho, the really interesting "bits" in decision-table theory/algorithms are in how one tests the validity (internal consistency) of all rules, or any potential new rule.
In your specific problem, you do have two "simplifying" conditions: P#n cannot point to P#n where #n is the same for both P; and, once a P is "pointed to," they are no longer available as "pointee." Also simplifying your problem is that you evidently don't wish a random ordering of the first item of the matched pairs.
If you change your task so you require a random ordering (sequence) of both elements in each pair, the problem becomes much more interesting.
If you think of the initial pool of "pointing possibilities," as being #56 ... each of the eight persons
could point to seven other people ... then ... if only two people in the pool of eight are "pointing," the pool of possible pointers and pointees has shrunk to six, with only #30 valid possible "pointings" left. That kind of exponential decrease in possibilities suggests, to me, as W. Balboos proposes in his answer: a "removal" strategy.
Decision Tables on CodeProject: [
^]. Of particular interest may be David Killian's October 2013 article.
Information on Decision Tables provided by Visual-Paradigm, a commercial software company: [
^]. Note: I do not work for them, or own their products.
Wikipedia: Decision Tables [
^].
Google: Decision Tables + C# [
^].