I agree 'Selective Access,' is the best approach to providing access rights to specific lists. However, I would add an additional point.
While maintaining a master product list I would also add a child branch to your countries to indicate only those products available in each. Use a numbered list as you will be repeating the name of some products. Devise a code from the first two letters of each country and the first two of the product.
Once these are created you can use, 'Selective Access,' as indicated but only restrict access to each country as the access restrictions apply to all child branches. This approach will also allow you to keep your model cell count to a minimum helping to improve model efficiency and performance. This is because we will only be creating cells that will be used and therefore keeping sparsity to a minimum. If we were to use the master list for all countries then there will be many combinations of country and product which will be empty and redundant.
You will need to create a mapping from your Country-Product list to the Master Product list indicating for each combination of Country-Product which product in Master Product list it relates to.
When referencing source data which contains the Master Product list use SUM to map across the two dimensions. In the source module add a line item and format it as the Country-Product list. Directly reference the Country-Product to Master Product mapping module to pull in the relevant Country-Product list item for each master product. You will need to use a LOOKUP function such as;
Country-Product Mapping Module.Master Product Mapping[LOOKUP:Source data module.Master Product]
The final line item in the function is a Master Product List formatted line item in the source data module. Use FINDITEM to create this if you do not have this already.
Once you have created the mapping in the source you are then able to map this to a target module using the following SUM function.
Source module.source line item[SUM:Source module.Country-Product Mapping]
This approach allows you to keep redundant cells to a minimum and to manage access rights via a single list.
If you need further clarity let me know and I will provide a more detailed explanation.
On reflection the mapping in my first reply would not be sufficient to give you the outcome I described.
To be able to query any source data using the additional country-product list you will will need to create a mapping module dimensioned by your country and master product list containing a list formatted line item for you country-product list.
You can populate this mapping manually for every valid combination or use FINDITEM where you are able to combine elements of each list; Country and Master Product into the code of your new list. I would recommend combining the first three letter of each list item as use this as your code for the new number country-product list. You can then use LEFT function to extract the relevant parts of each list name to use in the FINDITEM function.
Once you have created this list use it to populate a country-product line item in your source data which can then be used as a mapping in any SUM function which queries it.
Please let me know if you need me go into further detail.
While this approach may require some upfront investment in modelling it will be the most effective way to achieve your desired outcome.