JavaScript (ES10), 188 bytes
Another brute-force solution that is unlikely to solve the second test case before the heat death of the universe.
Results are 0-indexed.
(n,k,v)=>(g=(v,i=n,a=[])=>i--?g(v,i,a).concat(g(v-1,i,[i,...a])):v?[]:[a],F=s=>s.find(c=>g(v).every(b=>c.some(a=>b.every(v=>a.includes(v)))))||F(s.flatMap(a=>g(k).map(b=>[...a,b]))))([[]])
Try it online!
Commented
Helper function
\$g\$ is a helper function that, given \$v\$, returns the list of all subsets of \$[0\dots n-1]\$ of length \$v\$. (Note that it is meant to be defined in the scope of the main function so that \$n\$ is known.)
g = ( // g is a recursive function taking:
v, // v = expected length
i = n, // i = counter, initialized to n
a = [] // a[] = current subset
) => //
i-- ? // decrement i; if it was not zero:
g( // do a recursive call where
v, i, a // nothing is changed
) //
.concat( // append the result of
g( // another recursive call where
v - 1, // v is decremented
i, // and
[i, ...a] // i is inserted at the beginning of a[]
) //
) //
: // else:
v ? [] // ignore this subset if its length is not v
: [a] // otherwise, append it to the output list
Main function
(n, k, v) => ( // f is the main function, taking n, k, v
F = // F is a recursive function taking a list of
s => // lists of k-subsets
s.find(c => // is there a list c[] in s[] satisfying ...
g(v) // build all v-subsets
.every(b => // for each v-subset b[]:
c.some(a => // is there some k-subset a[] in c[] ...
b.every(v => // such that each value v in b[] ...
a.includes(v) // can be found in a[]?
) // end of every()
) // end of some()
) // end of every()
) // end of find()
|| // if no solution was found:
F( // do a recursive call:
s.flatMap(a => // for each entry a[] in s[]:
g(k) // build all k-subsets
.map(b => // for each k-subset b[]:
[...a, b] // append b[] to a[]
) // end of map()
) // end of flatMap()
) // end of recursive call
)([[]]) // initial call to F with a single empty list