You could try assigning a row number first to each row of each table, then match the two table on this ranking:
WITH cte_admin AS (
         SELECT groupID, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rn
         FROM tbl1 
     ),
     cte_administrator AS (
         SELECT groupID, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rn
         FROM tbl2
     )
SELECT t1.groupID AS g1,
       t2.groupID AS g2
FROM       cte_admin t1
INNER JOIN cte_administrator t2
        ON t1.rn = t2.rn
UNION
SELECT t1.groupID AS g1,
       t2.groupID AS g2
FROM      cte_admin t1
LEFT JOIN cte_administrator t2
       ON t1.rn = t2.rn
WHERE t2.rn IS NULL
UNION
SELECT t1.groupID AS g1,
       t2.groupID AS g2
FROM      cte_administrator t1
LEFT JOIN cte_admin  t2
       ON t1.rn = t2.rn
WHERE t2.rn IS NULL
A fully tested solution will be provided if you can share contents from the table tbl.
For the full outer join, three joins are needed:
- INNER JOINto match corresponding row numbers between the two tables
- LEFT JOIN from table1 to table2 WHERE table2 is nullto match excess rows from table1 in case this has more rows than table2
- LEFT JOIN from table2 to table1 WHERE table1 is nullto match excess rows from table2 in case this has more rows than table1
A pseudo test is done here.