We want our app listed on Appexchange and searchable on Appexchange. However, we don't want the app to be installed by the users. When a user tries to install the app, we want to disable/expire the app so that the user cannot use it. What would be the best to achieve this?
There's nothing requiring your app be directly installable from your listing. You can configure the listing to have a contact button instead of get it now if you prefer.
If for some reason you do want customers to be able to direct install but with an expired license you should be able to set the default license terms in the AppExchange publishing console to a trial with a zero (maybe it will require 1, but I think zero is valid) day trial.
Optionally you could add apex triggers, workflow, process builder, etc. to your license management organization to automatically suspend all newly created license records. This would however adversely impact customer sandboxes unless you excuse them from this rule or build more complex logic.