How to get such rule with a elegant method

Tuples /@ Thread[list -> List /@ list2]
{
 {1 -> {7, 89}, 2 -> {7, 89}, 3 -> {7, 89}, 5 -> {7, 89}},
 {5 -> {96, 5}, 3 -> {96, 5}, 9 -> {96, 5}, 11 -> {96, 5}, 12 -> {96, 5}},
 {5 -> {-6, -98}, 9 -> {-6, -98}, 10 -> {-6, -98}, 16 -> {-6, -98}}
}

MapIndexed[# -> list2[[#2[[1]]]] &, list, {2}]

or

ReplacePart[list, {i_, j_} :> list[[i, j]] -> list2[[i]]]

Thread /@ Thread[list -> Hold /@ list2] // ReleaseHold
Thread /@ Thread[list → Unevaluated /@ list2] /. a_ → b_ -> a -> b
Thread /@ Thread[list -> $ /@ list2] /. $ -> (# &)

As to the reason why I used RightArrow as a medium in the second solution, you may want to read this post.