# [R], <s>288</s> <s>281</s> 267 bytes

<!-- language-all: lang-r -->

_thanks to @cole for -1 byte, reordering the `?` to collapse the 2 into `rep(2,10)`_

    function(n){m=matrix(sample(strsplit("EAIONRTLSUDGBCMPFHVW?YKJXQZ","")[[1]],n^2,T,c(12,9,9,8,6,6,6,4,4,4,4,3,rep(2,10),1,1,1,1,1)),n,n)
    K=(n+1)/2
    if(n>8){i=!((col(m)-K)%%3|(row(m)-K)%%3|row(m)%in%c(1,n)|col(m)%in%c(1,n))
    m[i]=chartr("A-Z?","a-z!",m[i])}
    m[K,K]=" "
    m}

[Try it online!][TIO-j7htvwnq]

[R]: https://www.r-project.org/
[TIO-j7htvwnq]: https://tio.run/##RY9bS8NAEIXf8yvahcAMTtBNRVpwLfVe4916a4gQQoIL2W3YrFRs@9vjaqzlezpzDjNzTFN09oOm@NCZlTMNGhdKqNQa@Ql1qqoyh9qauiqlBXYyGt9c308uHx6Pzw6Prm5Pz5@eh6/RxcvdlBFjGMc8SUi/hTShDHhIA0ef9n7Z/aNHJq8gJL6DxNcgkiaNXiRAb3HcDj1ZgD7o40KKLkA2K0FhEKHv95ZgZvONaoUvte8uuhXLNrsZoKdimYjsPTXWABsF06F7Ng2@uox@HFy5QERRIliHeWrVzI20ORQwQNfJFajzSrhy3nrOW4P/O803 "R – Try It Online"

Returns a matrix. Fairly simple implementation; samples n^2 values with the proper distribution, stores as an `nxn` matrix.

`K` is the index of the center.

computes the indices of the matrix where the row and column distances from the center are both multiples of 3 and not on the edge (i.e., not `1` or `n`), lowercases those, replaces `?` with `!`, replaces the center with `" "`, and returns the matrix.