Good randomness in Python code for a lottery-like game
According to the Python documentation random.SystemRandom() uses os.urandom() which


  [...] returns random bytes from an OS-specific randomness source. The returned data should be unpredictable enough for cryptographic applications, though its exact quality depends on the OS implementation.


Given that your system does a good enough job, the output of random.SystemRandom() should be indistinguishable from true randomness, and thus be good enough for your purpose.

Also, if the randomness provided by your system is indistinguishable from true randomness, shuffling does not add anything to the randomness of your output (even if you had also used a cryprographically secure RNG for shuffling).

In this case your code could be reduced to

import random

def randomWeightedSelection(choices, weights):
    rng = random.SystemRandom()

    indices = list(range(len(choices)))

    selected_index = rng.choices(indices, weights = weights, k = 1)[0]

    return [choices[selected_index], selected_index]