You need your list to be actual strings:
list = {"resident", "occupant", "tenant", "resider", "inhabiter", "habitant", "dweller",
"citizen", "native", "denizen", "aborigine", "cohabitant"};
Now write a function to do the replacements on a single string:
ElideCharacters[count_Integer, new_String][s_String] :=
With[
{indices = RandomSample[Range[StringLength@s], count]},
StringReplacePart[s, new, Transpose[ArrayReshape[indices, {2, count}, indices]]]]
Example usage:
ElideCharacters[3, "*"]["resident"]
(* "*esid*n*" *)
Now map it over your list.
ElideCharacters[2, "-"] /@ list
(*
{"res--ent", "oc-up-nt", "--nant", "r--ider", "in-abi-er", "habi-a-t",
"-welle-", "cit-ze-", "nat-v-", "den-z-n", "aborig--e", "cohabi-an-"}
*)
Alternate
Maybe a clearer alternate function:
ElideCharacters[count_Integer, new_String][s_String] :=
With[
{indices = RandomSample[Range[StringLength@s], count]},
StringReplacePart[s, new, Transpose[{indices, indices}]]]
Update
I misread your last sentence. If you want the number of replacements to be randomized (but at least 2), you can use this overload (this assumes the strings will always be long enough):
ElideCharacters[new_String][s_String] :=
ElideCharacters[RandomInteger[{2, StringLength@s}], new][s]